package com.enlorenz.common.geo.analyzer.tracksplit;

import java.util.ArrayList;
import java.util.List;

import com.enlorenz.common.geo.base.IPoint;
import com.enlorenz.util.DataDetUtil;

/**
 * 轨迹点拆分工具
 * 将轨迹点拆分成均匀的点
 * @author lcb
 */
public abstract class AbstractTrackPointSplitor {
	/**
	 * 是否需要拆分
	 * @param p1
	 * @param p2
	 * @return
	 */
	protected abstract boolean isNeedSplit(IPoint stPoint,IPoint edPoint);
	/**
	 * 拆分元素
	 * @param p1
	 * @param p2
	 * @return
	 */
	protected abstract int splitElements(IPoint stPoint,IPoint edPoint);
	
	/**
	 * 创建新的点
	 * @param stPoint	开始点
	 * @param edPoint	结束点
	 * @param lon	经度
	 * @param lat	纬度
	 * @param split	拆分个数
	 * @param step	当前拆分的索引
	 * @return
	 */
	protected abstract IPoint createNewPoint(IPoint stPoint,IPoint edPoint,Double lon,Double lat,int split,int step);
	
	/**
	 * 获取拆分后的点列表
	 * @param posList
	 * @return
	 */
	public List<IPoint> getSplitedPointList(List<IPoint> posList){
		if(DataDetUtil.isCollectionEmpty(posList)){
			return posList;
		}
		
		List<IPoint> outputList=new ArrayList<IPoint>();
		IPoint pre=null;
		for(int i=0;i<posList.size();i++){
			IPoint htri=(IPoint)posList.get(i);
			if(null == pre){
				pre=htri;
				outputList.add(htri);
				continue;
			}
			//如果不需要拆分，则
			if(!isNeedSplit(pre, htri)){
				pre=htri;
				outputList.add(htri);
				continue;
			}
			
				//能拆分成多少段
			int split=splitElements(pre, htri);
			if(0 != split){
				double jdsp=(Double.valueOf(htri.getLon())-Double.valueOf(pre.getLon()))/split;
				double wdsp=(Double.valueOf(htri.getLat())-Double.valueOf(pre.getLat()))/split;
						
				double jdst=Double.valueOf(pre.getLon());
				double wdst=Double.valueOf(pre.getLat());
				for(int c=0;c<split;c++){
					jdst+=jdsp;
					wdst+=wdsp;
					outputList.add(createNewPoint(pre, htri, jdst, wdst, split, c));
				}
			}
			
			pre=htri;
			outputList.add(htri);
		}
		
		return outputList;
	}
}
